package com.shopmall.common.log.aspect;

import com.shopmall.common.log.annotation.Log;
import com.shopmall.common.log.service.AsyncOperateLogService;
import com.shopmall.common.log.utils.LogUtil;
import com.shopmall.model.entity.system.SysOperLog;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogAspect {
    @Autowired
    private AsyncOperateLogService asyncOperateLogService;

    //环绕通知
    @Around(value = "@annotation(sysLog)")
    public Object doAroundAdvice(ProceedingJoinPoint joinPoint, Log sysLog) {

        /*String title = sysLog.title();
        int businessType = sysLog.businessType();
        System.out.println("title: " + title + " ::businessType: " + businessType);*/

        // 业务方法之前，封装数据
        SysOperLog sysOperLog = new SysOperLog();
        LogUtil.beforeHandleLog(sysLog, joinPoint, sysOperLog);
        Object proceed = null;
        try {
            proceed = joinPoint.proceed();
            // 调用业务方法之后，封装数据
            LogUtil.afterHandLog(sysLog, proceed, sysOperLog, 0, null);
        } catch (Throwable e) {
            LogUtil.afterHandLog(sysLog, proceed, sysOperLog, 1, e.getMessage());
            throw new RuntimeException();
        }
        // 调用service方法把日志信息添加到数据库
        asyncOperateLogService.saveSysOperateLog(sysOperLog);
        return proceed;
    }
}
